

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintStream;
import java.util.Random;

public class Prigione {

	public static int ROWS;
	public static int COLUMN;
	public static Elementi[][] stanza;
	private static Elementi entrata = new Entrata();
	private static Elementi uscita = new Uscita();
	private static Arma ascia = new Arma("Ascia", 20);
	public String[][] tempArray=new String[10][10];

	public Prigione(int rows, int column) {
		ROWS = rows;
		COLUMN = column;
		stanza = new Elementi[ROWS][COLUMN];
	}

	public void creaStanza() {
		Random r = new Random();
		char c;
		int i, j, a, b;
		int l = 8; 					// variabile per limitare le pozioni
		String range = "abc"; 		// range di lettere, da cui ottenere casualmente i
									// vari elementi
		i = r.nextInt(ROWS);
		j = r.nextInt(COLUMN);
		setEl(i, j, entrata);
		do {
			a = r.nextInt(ROWS);
			b = r.nextInt(COLUMN);
		} while ((i == a) && (j == b));
		setEl(a, b, uscita);

		for (int x = 0; x < ROWS; x++) {
			for (int y = 0; y < COLUMN; y++) {
				if (getEl(x, y) == entrata) {
					setEl(x, y, Amministratore.player);
				}
				if (getEl(x, y) == null) {
					c = range.charAt(r.nextInt(range.length()));
					if (c == 'a') {
						setEl(x, y, new Muro());
					}
					else if (c == 'b') {
						if (l > 0) {
							setEl(x, y, new Pozione());
							l--;
						} else {
							setEl(x, y, new Vuoto());
						}
					}
					else if (c == 'c') {
						setEl(x, y, new Mostro(50, ascia));
					}
				}
			}
		}
	}
	
	
	public static Elementi getEl(int x, int y) { 
		return stanza[x][y];
	}

	public static void setEl(int x, int y, Elementi el) { 
		stanza[x][y] = el;
	}

	public int getPosx(Elementi el) {
		int posx = 0;
		for (int x = 0; x < ROWS; x++) {
			for (int y = 0; y < COLUMN; y++)
				if (getEl(x, y) == el) {
					posx = x;
				}
		}
		return posx;
	}

	public int getPosy(Elementi el) {
		int posy = 0;
		for (int x = 0; x < ROWS; x++) {
			for (int y = 0; y < COLUMN; y++)
				if (getEl(x, y) == el) {
					posy = y;
				}
		}
		return posy;
	}

	public static int getROWS() {
		return ROWS;
	}

	public static void setROWS(int rOWS) {
		ROWS = rOWS;
	}

	public static int getCOLUMN() {
		return COLUMN;
	}

	public static void setCOLUMN(int cOLUMN) {
		COLUMN = cOLUMN;
	}

	public static Elementi[][] getStanza() {
		return stanza;
	}

	public static void setStanza(Elementi[][] stanza) {
		Prigione.stanza = stanza;
	}

	public static Elementi getEntry() {
		return entrata;
	}

	public static void setEntry(Elementi entrata) {
		Prigione.entrata = entrata;
	}

	public static Elementi getExit() {
		return uscita;
	}

	public static void setExit(Elementi uscita) {
		Prigione.uscita = uscita;
	}

	public  boolean victory(int x, int y) {
			if (getEl(x, y) instanceof Uscita)
				return true;
			else
				return false;
	}

	public boolean findMonster(int x, int y) {
			if (getEl(x, y) instanceof Mostro)
				return true;
			else
				return false;
	}
	
	public boolean findWall(int x, int y){
		if (getEl(x, y) instanceof Muro){
			return true;
		}
		else return false;
	}

	public void visualizzaStanzaCompleta() {   //visualizza stanza versione 'disonesta'
		for (int x = 0; x < ROWS; x++) {
			System.out.print("\n");
			for (int y = 0; y < COLUMN; y++){
				if(Prigione.getEl(x, y) instanceof Giocatore)
					System.out.print("| G |");
				else if(Prigione.getEl(x, y) instanceof Mostro)
					System.out.print("| M |");
				else if(Prigione.getEl(x, y) instanceof Pozione)
					System.out.print("| p |");
				else if(Prigione.getEl(x, y) instanceof Muro)
					System.out.print("| # |");
				else if(Prigione.getEl(x, y) instanceof Vuoto)
					System.out.print("| . |");
				else if(Prigione.getEl(x, y) instanceof Uscita)
					System.out.print("| U |");
			}
		}
	}

	public void visualizzaStanza() {      //visualizza stanza versione 'onesta'
		for (int x = 0; x < ROWS; x++) {
			System.out.print("\n");;
			for (int y = 0; y < COLUMN; y++){
				if(Prigione.getEl(x, y) instanceof Giocatore)
					System.out.print("| G |");
				else if(Prigione.getEl(x, y) instanceof Muro)
					System.out.print("| # |");
				else if(Prigione.getEl(x, y) instanceof Uscita)
					System.out.print("| U |"); 
				else
					System.out.print("| * |");
			}
		}
	}

	public void save() {   //salvataggio della partita su file di testo
		try {
			FileOutputStream prova = new FileOutputStream("Salvataggio.txt");
			@SuppressWarnings("resource")
			PrintStream scrivi = new PrintStream(prova);
			for (int i = 0; i < ROWS; i++) {
				for (int j = 0; j < COLUMN; j++){
					if(Prigione.getEl(i, j) instanceof Giocatore)
						scrivi.print("G ");
					else if(Prigione.getEl(i, j) instanceof Mostro)
						scrivi.print("M ");
					else if(Prigione.getEl(i, j) instanceof Pozione)
						scrivi.print("p ");
					else if(Prigione.getEl(i, j) instanceof Muro)
						scrivi.print("# ");
					else if(Prigione.getEl(i, j) instanceof Vuoto)
						scrivi.print(". ");
					else if(Prigione.getEl(i, j) instanceof Uscita)
						scrivi.print("U ");
				}
			}
			scrivi.print(Amministratore.player.getLife() + " "
			 + Amministratore.player.getWeapon().tipo + " "
			 + Amministratore.player.getWeapon().danno
			 );
		}catch (IOException e) {
			System.out.println("Errore: " + e);
			System.exit(1);
		}
	}
	
	public void load() {  //caricamento partita da file di testo
		BufferedReader reader = null;
		try {
			reader = new BufferedReader(new FileReader("Salvataggio.txt"));
		} catch (FileNotFoundException e) {
			System.out.println("Errore: " + e);
			System.exit(1);
		}
		String line = null;
		try {
			while ((line = reader.readLine()) != null) {
				String[] parts = line.split("\\s");
				int k=0;
					for (int i = 0; i < ROWS; i++) {
						for (int j = 0; j < COLUMN; j++) {
							tempArray[i][j] = parts[k];
							k++;
						}
					}
					Integer loadLife = Integer.valueOf(parts[(ROWS*COLUMN)]);
					String nomeArma = parts[(ROWS*COLUMN)+1];
					Integer forzaArma = Integer.valueOf(parts[(ROWS*COLUMN)+2]);
					Arma tempArma = new Arma (nomeArma,forzaArma);
				for (int i = 0; i < ROWS; i++) {
					for (int j = 0; j < COLUMN; j++) {
						if (tempArray[i][j].contains("G")) {
							Amministratore.player = new Giocatore(loadLife,tempArma);
							setEl(i,j,Amministratore.player);
						}
						else if (tempArray[i][j].contains("M")) {
							setEl(i,j, new Mostro(50, Amministratore.ascia));
						}
						else if (tempArray[i][j].contains("#")) {
							setEl(i,j, new Muro());
						}
						else if (tempArray[i][j].contains("p")) {
							Pozione p = new Pozione();
							setEl(i,j,p);
						}
						else if (tempArray[i][j].contains("U")) {
							setEl(i,j,uscita);
						}
						else if (tempArray[i][j].contains(".")) {
							setEl(i,j, new Vuoto());
						}
						
					}
				}
			}
		} catch (IOException e) {
			System.out.println("Errore: " + e);
			System.exit(1);
		}

	}
}
